/*
 * graph2D
 * Copyright (c) 2009 Shun Moriya <shun@mnu.sakura.ne.jp>
 *
 * The MIT License
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
 * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
 * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
 * THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 */

#if !defined(___GRAPHC2D_TEXT_H___)
#define ___GRAPHC2D_TEXT_H___

#if !defined(___GRAPH2D_COMMON_H___)
#include "common.h"
#endif
#if !defined(___GRAPH2D_COLOR_H___)
#include "color.h"
#endif
#if !defined(___GRAPH2D_COMPONENT_H___)
#include "component.h"
#endif
#if !defined(___GRAPH2D_VECTOR2_H___)
#include "vector2.h"
#endif
#if defined(TARGET_IPHONE)
#if !defined(___GRAPHC2D_TEXT_IMPL_H___)
#import "platform/iOS/text_impl.h"
#endif
#elif defined(TARGET_WINDOWS)
#if !defined(___GRAPHC2D_TEXT_IMPL_H___)
#include "platform/windows/text_impl.h"
#endif
#endif

#include <cstdarg>
#include <string>

namespace Graph2D
{
#if !defined(TARGET_APPLE)
	typedef int UITextAlignment;
#endif

	//! @brief テキストクラス
#if 1
	class Text : public Component
#else
	class Text : public Sprite
#endif
	{
		DISALLOW_COPY_AND_ASSIGN(Text);

		//! @brief 親クラス型
#if 1
		typedef Component super;
#else
		typedef Sprite super;
#endif

	public:
		//! @brief コンストラクター
		Text();
		//! @brief コンストラクター
		Text(const size_t fontSize);
		//! @brief コンストラクター
		Text(const std::string& fontName, const size_t fontSize);
		//! @brief デストラクター
		virtual ~Text();

		/*!
		 * @brief	タイプ名を取得
		 * @return	タイプ名
		 */
		virtual const char* getTypeName() const
		{
			return "Text";
		}

		//! @brief クリア
		void clear();
		/*!
		 * @brief	文字列が空か取得
		 * @return	trueならば空
		 */
		bool empty() const
		{
			return text.empty();
		}

		static size_t getDefaultFontSize()
		{
			return 16;
		}

		//! @brief フォント名を設定
		void setFontName(const std::string& fontName);
		//! @brief フォントサイズを設定
		void setFontSize(const float fontSize);

		//! @brief フォント色を取得
		const Color& getTextColor() const;
		//! @brief フォント色を設定
		void setTextColor(const Color& color);
		/*!
		 * @brief	フォント色を設定
		 * @param[in]	r	赤
		 * @param[in]	g	緑
		 * @param[in]	b	青
		 * @param[in]	a	不透明度
		 */
		void setTextColor(const float r, const float g, const float b, const float a)
		{
			setTextColor(Color(r, g, b, a));
		}

		// 削除予定
		TextAlignmentH getTextAlignmentH() const;
		void setTextAlignmentH(const TextAlignmentH textAlignment);
		TextAlignmentV getTextAlignmentV() const;
		void setTextAlignmentV(const TextAlignmentV textAlignment);

		//! @brief 文字列取得
		const std::string& getString() const;
		//! @brief 文字列設定
		void setString(const std::string& text);
		/*!
		 * @brief		文字列設定
		 * @param[in]	文字列
		 */
		void setString(const char* text)
		{
			setString(std::string(text));
		}
		//! @brief 書式付文字列設定
		void format(const char* format, ...);
		//! @brief 書式付文字列設定
		void vformat(const char* format, va_list ap);
		//! @brief 文字列置換
		void replace(const char* key, const char* word);

		//! @brief サイズ調整
		void adjustSize(const bool useParentWindowSize = true);
		//! @brief 調整されたサイズを取得
		Vector2 getAdjustedSize(const bool useParentWindowSize = true);

		//! @brief シリアライズイベント
		virtual void onSerialize(mana_stream* stream) const;
		//! @brief デシリアライズイベント
		virtual void onDeserialize(mana_stream* stream);
		//! @brief 更新イベント
		virtual void onUpdate(const UpdateInfomation& updateInfomation);
		//! @brief 描画イベント
		virtual bool onDraw(const DrawRect& drawRect);

		//! @brief 同じテキストか比較
		virtual bool compare(const Text& other) const;

	private:
		void request();

	private:
		void* instance;		//!< プラットフォーム依存クラスへのポインター
		std::string text;	//!< テキスト
		Color textColor;	//!< テキストの色
		bool dirty;			//!< 更新フラグ
		bool valid;			//!< 有効フラグ
	};
}

#endif
